feat(extension): ツールバーアイコンクリックで現在のGitHubリポジトリをPera1展開#3
Conversation
- chrome.action クリックで現在タブのGitHub URLをPera1 URLに変換し新規タブで展開(Manifest V3 / service worker / activeTab最小権限) - 変換ロジックを pera1-url.js に分離(tree/blob/rawパス対応、Issues/PR等はリポジトリルートへフォールバック、クエリ・ハッシュ除去) - content.js のリンク先を死にホスト pera1.pages.dev から pera1.kazu-san.workers.dev に修正 - ページ内ボタンの挿入先を ul.pagehead-actions(Watch/Fork/Starの並び)に変更しタイトル下への折り返しを解消 - アイコンを favicon.svg 由来の 16/32/48/128px に刷新、generate-icons.sh も rsvg-convert 方式に更新 - vitestユニットテスト9件と実ブラウザPlaywright E2E(tests/e2e/extension.e2e.mjs)を追加 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
リモートのlockfileがpackage.jsonに追加済みのdevDependencies (vite/vitest/typescript等)を含んでいなかったためpnpm installで同期 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
🚀 Preview deployed! https://pera1-preview.kazu-san.workers.dev This preview will be updated on every push to this PR. |
There was a problem hiding this comment.
Pull request overview
Chrome 拡張のツールバーアイコン押下で、現在表示中の GitHub リポジトリ(/tree, /blob, /raw 等を含む)を Pera1 の 1ページ展開ビューで開けるようにし、既存のページ内ボタンも「死にホスト」から実稼働 Worker ドメインへ修正した変更です。URL 変換ロジックを共通化し、ユニットテスト/E2E テストも追加されています。
Changes:
- Manifest V3 の
action+ service worker を追加し、ツールバーアイコン押下で現在タブ URL を Pera1 URL に変換して新規タブで開くようにした - URL 変換ロジックを
extension/pera1-url.jsに分離し、vitest のユニットテストを追加した - content script のリンク先ホスト修正と、ページ内ボタンの挿入位置(
ul.pagehead-actions優先)を改善した
Reviewed changes
Copilot reviewed 8 out of 17 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
extension/background.js |
ツールバーアイコンクリック時に URL 変換→タブ生成、変換不可時はバッジ表示 |
extension/pera1-url.js |
GitHub URL → Pera1 URL 変換の共通ロジック(tree/blob/raw/非コードページ対応) |
extension/manifest.json |
MV3 action/background/activeTab/icons の追加 |
extension/content.js |
ページ内ボタンのリンク先ホスト修正+挿入位置の改善 |
extension/generate-icons.sh |
favicon.svg から拡張アイコン生成するスクリプトへ更新 |
tests/unit/extension-url.spec.ts |
URL 変換ロジックのユニットテスト追加 |
tests/e2e/extension.e2e.mjs |
実 Chromium + 実 GitHub + 実 Worker の拡張 E2E テスト追加 |
pnpm-lock.yaml |
開発依存関係の追加/更新に伴う lock 更新 |
.artifacts/chrome-extension/REPORT.md |
実装内容・検証結果のレポート追加 |
Files not reviewed (1)
- pnpm-lock.yaml: Generated file
Comments suppressed due to low confidence (1)
extension/manifest.json:17
- The content script only matches
https://github.com/*/*, so the in-page button won't appear onhttps://www.github.com/...even though the URL conversion logic explicitly supports thewwwhost. Add thewwwpattern to keep behavior consistent.
"content_scripts": [
{
"matches": ["https://github.com/*/*"],
"js": ["content.js"],
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| function loadPlaywright() { | ||
| for (const base of [process.cwd(), join(homedir(), "node_modules")]) { | ||
| try { | ||
| const req = createRequire(join(base, "/")); | ||
| return req("playwright"); |
There was a problem hiding this comment.
検証しましたが、これは事実誤認です。Node.jsの path.join(base, "/") は base を破棄せず末尾セパレータ付きの "<base>/" を返します(例: join("/Users/x/node_modules", "/") → "/Users/x/node_modules/")。末尾セパレータ付きディレクトリは createRequire の正規の基点であり、実機で playwright の解決とE2E実行が複数回成功することを確認済みです。誤解防止のためコメントを追記しました(51c0ce8)。
| return chrome.tabs.create({ | ||
| url: pera1Url, | ||
| index: tab.index + 1, | ||
| openerTabId: tab.id, | ||
| }); |
There was a problem hiding this comment.
ご指摘の通りです。51c0ce8 で index / openerTabId を型ガードしました(typeof === "number" && >= 0 のときのみ指定、それ以外は undefined)。E2Eで実ブラウザ動作も再確認済みです。
| chrome.action.onClicked.addListener((tab) => { | ||
| openInPera1(tab); | ||
| }); |
There was a problem hiding this comment.
ご指摘の通りです。51c0ce8 で onClicked リスナーに .catch() を追加し、失敗時は console.error でログ出力するようにしました。
| '@cloudflare/vite-plugin@1.40.0': | ||
| resolution: {integrity: sha512-v77QQ2AdyBB+XW6uzKpWanbQy7ckYqSXFwJgQN871XITqLdJTdYOAWxt/jLPw9tNnHkKS6HTwV9+9bfQcLWz/w==} | ||
| hasBin: true | ||
| peerDependencies: | ||
| vite: ^6.1.0 || ^7.0.0 || ^8.0.0 | ||
| wrangler: ^4.98.0 | ||
|
|
There was a problem hiding this comment.
ご指摘の通りです。51c0ce8 で wrangler を ^4.98.0 に更新し、@cloudflare/vite-plugin@1.40.0 の peerDependencies(wrangler ^4.98.0)と整合させました。pnpm build / vitest 42件 / E2E すべてグリーンを確認済みです。
- background.js: chrome.tabs.create の index/openerTabId を型ガード(部分的なtabオブジェクトでもNaN/不正IDにならない) - background.js: onClicked リスナーで openInPera1 の rejection を捕捉しログ出力(unhandled rejection防止) - wrangler を ^4.98.0 に更新し @cloudflare/vite-plugin@1.40.0 の peerDependencies と整合(build/test/E2E全グリーン確認済み) - e2e: createRequire(join(base, "/")) が正規の用法である旨のコメントを追記(joinはbaseを保持する) - E2E再実行でスクショ証跡を撮り直し Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
WHY
pera1.pages.devは DNS解決すらできない死にホストで、実質機能していなかった。HOW
action+ service worker(background.js)でchrome.action.onClickedを購読し、現在タブのURLを変換してchrome.tabs.createで開く。権限はactiveTabのみ(クリック時だけURLを読める最小権限)。extension/pera1-url.jsに分離し、service worker とテストで同一実装を共有。tree/blobはそのまま、raw→blob、Issues/PR等の非コードページはrepoルートにフォールバック、#L10やクエリは除去、GitHub以外はバッジ「!」表示のみ。pera1.kazu-san.workers.devに統一(curlで200確認済み)。ul.pagehead-actions(Watch/Fork/Starの並び)に変更。WHAT
extension/background.js/extension/pera1-url.js: 新規extension/manifest.json: v1.1.0、action/background/activeTab/icons追加extension/content.js: 死にホスト修正+ボタン配置改善extension/icon{16,32,48,128}.png/generate-icons.sh: favicon.svg由来に刷新tests/unit/extension-url.spec.ts: vitest 9件(全42件パス)tests/e2e/extension.e2e.mjs: 実Chromium+実GitHub+実WorkerのE2E(モックなし)Evidence
詳細は .artifacts/chrome-extension/REPORT.md を参照。reviwレビューで approve 済み(「コミットpushしていいよ。」)。
🤖 Generated with Claude Code